/*
    方便在油猴中引入代码，使用直接执行方法。
 */
// ==UserScript==
// @name         图片-替换src
// @namespace
// @version      0.1
// @description  
// @author       You
// @icon         http://wuweijun.fun/favicon.ico
// @match        http://*/*
// @match        https://*/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
(function () {
  'use strict';

  let imgObj = []; // 保存img元素属性符合的img元素
  let imageUrls = []; // 记录图片 URL 数组

  try {
    let count = 0, flag = false;
    let t1 = setInterval(() => {
      count++;
      document.querySelectorAll('img').forEach(item => {
        let datasets = Object.keys(item.dataset);
        if (datasets.length == 0) return;
        let url = [];
        let datasets_ = [];
        datasets.forEach(tt => {
          if (/https:/g.test(item.dataset[tt]) || /http:/g.test(item.dataset[tt])) {
            count = 15; flag = true

            // item.src = item.dataset[tt]; // 把元素属性上的图片url设置到src上，免除懒加载
            url.push(item.dataset[tt]);
            datasets_.push(tt);
          }
        })
        imgObj.push({ item, url, dataset: datasets_ });
        imageUrls = imageUrls.concat(url);
      })
      if (flag || count > 10) {
        clearInterval(t1)
      }
      // changeImgSrc();
      if (imageUrls.length > 0) preloadImages(imageUrls);

    }, 400)

  } catch (error) { alert('图片-替换src 异常') }


  // 更改img的src属性
  function changeImgSrc() {
    let index = 0;
    let jjjldj = setInterval(() => {
      if (imgObj.length > 0 && imgObj.length > index) {
        let imgObjImgObjIndex = imgObj[index];
        try {
          let img = imgObjImgObjIndex['item'];
          let urls = imgObjImgObjIndex['url'];
          urls.forEach(item => {
            img.src = item
          })
          index++;
        } catch (error) {
          console.error('error', imgObjImgObjIndex)
        }
      } else {
        clearInterval(jjjldj);
      }
    }, 100);

  }

  // 预加载图片的函数，只发送一个图片请求，但是不显示
  function preloadImages(urls, callback) {
    let index = 0; // 已加载图片计数器
    let loadedCount = 5; // 一次性请求多少个图片
    const totalCount = urls.length; // 总图片数
    const preloadedImages = []; // 存储预加载的图片对象（可选）
    let sldjfieo = setInterval(() => {
      if (loadedCount <= 0) return;
      loadedCount--;
      let u = urls[index];
      if (/webp|other/g.test(u)) {
        fetch(u).then(d => { loadedCount++; }).catch(e => { loadedCount++; });
      } else {
        const img = document.createElement('img');
        img.src = u;
        img.onload = () => { loadedCount++; };
        img.onerror = () => { loadedCount++; };
      }
      index++;
      if (index >= totalCount) {
        clearInterval(sldjfieo);
      }
    }, 200);
  }

}
)();
